package org.linlinjava.litemall.admin.job;


import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.linlinjava.litemall.db.domain.LitemallBase;
import org.linlinjava.litemall.db.domain.LitemallUser;
import org.linlinjava.litemall.db.service.LitemallBaseService;
import org.linlinjava.litemall.db.service.LitemallMoneyLogService;
import org.linlinjava.litemall.db.service.LitemallUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;

/**
 * 每日  24 时结算 sum fst
 */
@Component
public class MoneyJob {

    private final Log logger = LogFactory.getLog(MoneyJob.class);

    @Autowired
    private LitemallUserService  litemallUserService;

    @Autowired
    private LitemallBaseService litemallBaseService;

    @Autowired
    private LitemallMoneyLogService litemallMoneyLogService;

    /**
     * 建立一个  lock 轻锁 ，支付 最好还是 同步 ，所以使用同步锁
     */
    private Lock lock = new ReentrantLock();


    /**
     * 系统开启定时任务, 开始将所有用户FSP > 0 的用户的 fsp 转sun
     * 转换比例由 base表决定
     */
    @Scheduled(cron = "0 0 0 * * ?")
    public void fspsetsun()  {
        logger.info("系统开启定时任务, 开始将所有用户FSP > 0 的用户的 fsp 转sun");

        try{
            lock.lock();

            List<LitemallUser>   litemallUsers  =litemallUserService.findfspdaling();
            if(litemallUsers==null  ||  litemallUsers.size()==0){        logger.info("无任何可以转换fsp的用户"); return ;}
// 遍历所有有fsp的 人 ，帮他们转sun
            for (LitemallUser litemallUser:  litemallUsers) {

                //使用多线程 锁住当前对象 ，不然会出现 所有代码执行两次的 BUG

                int id = litemallUser.getId();
                double myfsp = litemallUser.getFSP();
                double lastfsp = 0.00;
                if (myfsp >= 1) {
                    lastfsp = myfsp * Double.parseDouble(litemallBaseService.selectBYnumber("ZH001")) * 0.01;

                    /**
                     * 加减 fsp sun
                     */
                    litemallUserService.MoneyProup(id, lastfsp, 2);
                    litemallUserService.MoneyProdown(id, lastfsp, 0);
/**
 * 录入日志
 */
                    litemallMoneyLogService.insertMoney(lastfsp, 0, "24时，FSP自动转SUN，失去FSP", id, "FSP", 0,myfsp-lastfsp,0);
                    litemallMoneyLogService.insertMoney(0, lastfsp, "24时，FSP自动转SUN，得到SUN", id, "SUN", 0,litemallUser.getSUN()+lastfsp,0);

                }


            }

            logger.info("已完成将所有用户FSP > 0 的用户的 fsp 转sun");


        }
        catch (Exception  e)
        {
            e.printStackTrace();
        }
        finally {
            lock.unlock();
        }



    }



    /**
     * 系统开启定时任务, sund自动增长
     * 转换比例由 base表决定
     */
    @Scheduled(cron = "0 10 0 * * ?")
    public void sundup()  {


        try {
            lock.lock();
            logger.info("系统开启定时任务, sund自动增长");
            List<LitemallUser>   litemallUsers  =litemallUserService.findsundaling();
            if(litemallUsers==null  ||  litemallUsers.size()==0){        logger.info("无任何可以加SUND的用户"); return ;}
            double lastsund = Double.parseDouble(litemallBaseService.selectBYnumber("ZH002")) * 0.01;

// 遍历所有有fsp的 人 ，帮他们转sun
            for (LitemallUser litemallUser:  litemallUsers) {
                //使用多线程 锁住当前对象 ，不然会出现 所有代码执行两次的 BUG

                    int id = litemallUser.getId();
                    double mysun = litemallUser.getSUN();
                    double mysund = litemallUser.getSUND();

                    if (mysun >= 0) {
                        /**
                         *  sund
                         */
                        litemallUserService.MoneyProup(id,lastsund,3);
                                        /**
                                            * 录入日志
                                            */
                        litemallMoneyLogService.insertMoney(0, lastsund, "24时，SUND自动增长", id, "SUND", 0,mysund+lastsund,0);
                }

            }
            logger.info("已完成将所有用户sund自动增长");
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }


    }

}
